MongoDB to MariaDB Migration
MongoDB에서 MariaDB로의 마이그레이션은 단순히 데이터를 복사하는 것 이상의 작업입니다. NoSQL 문서 기반 데이터베이스에서 관계형 데이터베이스로 전환할 때는 데이터 모델링, 데이터 변환, 그리고 도구 선택 측면에서 여러 고려사항이 필요합니다. 특히 Prisma ORM을 사용하고 계시다면, 기존 스키마를 어떻게 재구성할지에 대한 고민도 함께해야 합니다.
아래는 전반적인 접근 방식과 구체적인 단계입니다.
1. 사전 준비
-
백업:
마이그레이션 전에 MongoDB 데이터를 반드시 백업하세요. 문제가 발생할 경우 원복할 수 있어야 합니다. -
테스트 환경 구성:
실제 운영 환경에 적용하기 전, 테스트 환경에서 마이그레이션 절차를 충분히 검증해 보세요.
2. 데이터 모델링 재설계
MongoDB는 스키마가 유연하여 중첩된 객체, 배열 등이 자유롭게 존재할 수 있습니다. MariaDB와 같은 관계형 DB에서는 데이터 정규화와 테이블 간의 관계(외래 키 등)를 명확하게 정의해야 합니다.
-
컬렉션 → 테이블 매핑:
각 MongoDB 컬렉션을 기본으로 테이블로 변환합니다. -
중첩 데이터 처리:
중첩된 객체나 배열은 별도의 테이블로 분리한 후, 외래 키를 통해 관계를 정의합니다. -
타입 변환:
MongoDB의ObjectId
나 동적 타입 데이터를 MariaDB의 적절한 타입(예: 문자열 또는 정수)으로 변환하는 로직이 필요합니다. -
Prisma 스키마 업데이트:
기존 Prisma 스키마가 MongoDB용으로 작성되었다면, MariaDB에 맞게 스키마를 재작성해야 합니다. 예를 들어, datasource의 provider를"mysql"
로 변경합니다.datasource db { provider = "mysql" // MariaDB는 MySQL과 호환됨 url = env("DATABASE_URL") } // 새로운 모델 정의 예시 model User { id Int @id @default(autoincrement()) name String email String @unique posts Post[] } model Post { id Int @id @default(autoincrement()) title String content String? userId Int user User @relation(fields: [userId], references: [id]) }
3. 데이터 추출 (Export)
MongoDB에서 데이터를 추출하는 방법은 여러 가지가 있습니다.
-
mongoexport 사용:
mongoexport --uri "mongodb://<username>:<password>@host:port/dbname" --collection <collectionName> --out <collectionName>.json
각 컬렉션별로 JSON 파일을 생성할 수 있습니다.
-
Node.js 스크립트:
MongoDB Node.js 드라이버를 이용해 데이터를 읽어오고, 직접 변환 로직을 구현할 수도 있습니다.
4. 데이터 변환 (Transformation)
관계형 데이터베이스에 맞도록 데이터를 변환하는 작업이 필요합니다.
-
필드 변환:
예를 들어, MongoDB의ObjectId
를 MariaDB의 정수형 PK나 문자열로 변환하는 작업이 필요합니다. -
중첩 데이터 평탄화:
중첩된 데이터 구조를 적절히 분리하여 여러 테이블에 분배합니다. -
데이터 정합성 검증:
데이터가 변환 과정에서 누락되거나 잘못 변환되지 않도록 검증 로직을 포함합니다.
5. 데이터 적재 (Load)
변환된 데이터를 MariaDB에 적재하는 단계입니다.
-
Prisma Client 사용:
Node.js 환경에서 Prisma Client를 사용하여 MariaDB에 데이터를 삽입할 수 있습니다. 예를 들어:const { PrismaClient } = require('@prisma/client'); const prisma = new PrismaClient(); async function migrateUserData(mongoUsers) { for (const user of mongoUsers) { // 예시: MongoDB에서 추출한 user 데이터를 변환 후 삽입 await prisma.user.create({ data: { name: user.name, email: user.email, // 추가 데이터 매핑 }, }); } }
-
배치 처리:
데이터 양이 많을 경우 배치 처리를 통해 트랜잭션 내에서 일괄 삽입하거나, 스트리밍 방식으로 데이터를 처리하세요. -
ETL 도구 사용:
복잡한 변환이 필요하다면 Pentaho, Talend, Apache NiFi와 같은 전문 ETL 도구도 고려할 수 있습니다.
6. 마이그레이션 스크립트 작성 및 실행
-
두 개의 Prisma 스키마 관리:
Prisma는 한 스키마 파일 내에서 동시에 MongoDB와 MariaDB를 연결하기 어렵습니다.- 방법 1: 별도의 Prisma 스키마 파일을 작성하여 MongoDB와 MariaDB 각각에 연결한 후, Node.js 스크립트에서 두 클라이언트를 번갈아 사용합니다.
- 방법 2: MongoDB 데이터를 JSON 등으로 추출한 후, MariaDB에 연결된 Prisma 스키마로 전환하여 데이터 적재를 진행합니다.
-
마이그레이션 스크립트 예시:
- MongoDB에서 데이터를 읽어오기
- 데이터 변환 로직 적용
- Prisma Client를 통해 MariaDB에 삽입
- 오류 발생 시 롤백 및 로그 기록
7. 검증 및 후속 작업
-
데이터 검증:
MariaDB에 적재된 데이터와 원본 MongoDB 데이터를 비교하여 정합성을 확인하세요. -
인덱스 및 성능 튜닝:
관계형 DB에서는 인덱스, 조인 최적화 등이 중요합니다. 마이그레이션 후 적절한 인덱싱 및 쿼리 최적화를 수행하세요. -
애플리케이션 업데이트:
데이터베이스가 변경됨에 따라 Prisma 스키마 및 관련 비즈니스 로직을 수정해야 할 수 있습니다. -
점진적 전환 고려:
서비스 중단 없이 마이그레이션을 진행하려면, 일정 기간 동안 두 시스템을 병행 운영하면서 점진적으로 전환하는 전략도 검토해 보세요.
요약
- 백업 및 테스트 환경 준비
- 관계형 데이터 모델 설계 및 Prisma 스키마 업데이트
- MongoDB 데이터 추출 (mongoexport 또는 Node.js 스크립트 활용)
- 데이터 변환 로직 구현 (필드 변환, 중첩 데이터 평탄화 등)
- MariaDB에 데이터 적재 (Prisma Client 사용, 배치 처리 고려)
- 검증 및 성능 튜닝, 애플리케이션 업데이트